/**
 * 
 */
package t4j.typeinfo;

import java.util.Random;

/**
 * @author sz
 *
 * create time：2012-12-12
 */
class Initable{
	static final int staticFinal = 47;
	
	static final int staticFinal2 = ClassInitialization.rand.nextInt(1000);
	
	static{
		System.out.println("Initialzing Initable");
	}
}

class Initable2{
	static int staticNonFinal = 147;
	
	static {
		System.out.println("init Initable2");
	}
}

class Initable3{
	static int staticNonFinal = 74;
	static{
		System.out.println("init Initable3");
	}
}

public class ClassInitialization {
	public static Random rand = new Random(47);
	
	public static void main(String[] args) throws ClassNotFoundException {
		Class initable = Initable.class;//仅使用.class语法来获得对类的引用不会引发初始化
		
		System.out.println("After creating Initable ref");
		
		//一个static final值是“编译期常量”，这个值不需要对类进行初始化就可以被读取
		System.out.println(Initable.staticFinal);
		
		System.out.println(Initable.staticFinal2);//因为这里不是编译期常量，所以触发初始化
		
		//一个static域不是final的，总是要求在它被读取之前，要先进行链接（为这个域分配存储空间）和初始化（初始化该存储空间）
		System.out.println(Initable2.staticNonFinal);
		
		Class initable3 = Class.forName("t4j.typeinfo.Initable3");//使用Class.forName（）立即就进行初始化
		
		System.out.println("After creating Initable3 ref");
		
		System.out.println(Initable3.staticNonFinal);
	}
}
